﻿package com.nj.dms.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * Servlet生成一个长度为四位随机字符串图片
 */
@WebServlet("/ImageRandeCode")
public class ImageRandeCode extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		
//		PrintWriter out=response.getWriter();//获取打印字符输出流，输出目标互联网上的指定的客户端
//		out.println("<p>hello</p>");//输出html内容
//		
//		ServletOutputStream os= response.getOutputStream();//获取字节输出流，输出目标当前连接中的客户端；
//		os.write(image);
		// 设置页面不缓存
		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);
		// 生成验证码的实例对象
		// 调用里面的方法，返回的是生成的验证码中的字符串
		// 调用response.getOutputStream()向客户端输出一个随机产生的数字图像信息（二进制流）
		String str = this.getEnsure(0, 0, response.getOutputStream());
		// 获得session，并把随机生成的字符串保存在session中，为后面的对比做基础
		HttpSession session = request.getSession();
		session.setAttribute("randomCode", str);
	}

	// 定义一个用于获取四位随机数的数组
	private char mapTable[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8',
			'9','A','B','C','D','E','F','H','J','H','I' };

	// 生成验证码,并返回随机生成的字符
	public String getEnsure(int width, int height, OutputStream os) {
		//生成一个内存图片
		if (width <= 0)
			width = 50;
		if (height <= 0)
			height = 15;
		BufferedImage image = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB);
		// 获取图形上下文
		Graphics g = image.getGraphics();
		// 设定背景色
		g.setColor(new Color(0xDCCCCC));
		g.fillRect(0, 0, width, height);
		// 画边框
		// g.setColor(Color.black);
		// g.drawRect(0, 0, width - 1, height - 1);
		// 取随机产生的认证码
		String strEnsure = "";
		// 4代表4位验证码
		for (int i = 0; i < 4; ++i) {
			//随机生成一个包含四个字符的字符串
			strEnsure += mapTable[(int) (mapTable.length * Math.random())];
		}
		// 将认证码显示到图象中
		g.setColor(Color.red);
		g.setFont(new Font("Atlantic Inline", Font.ITALIC, 12));
		// 画的具体坐标
		String str = strEnsure.substring(0, 1);// 取出第一个字符
		//调用Graphics类的drawString()方法绘出该字符
		g.drawString(str, 3, 10);// 绘第一个字符
		str = strEnsure.substring(1, 2);// 取出第二个字符
		g.drawString(str, 15, 10);// 绘第二个字符
		str = strEnsure.substring(2, 3);// 取出第三个字符
		g.drawString(str, 27, 10);// 绘第三个字符
		str = strEnsure.substring(3, 4);// 取出第四个字符
		g.drawString(str, 39, 10);// 绘第四个字符
		// 释放图形上下文
		g.dispose();
		try {
			// 1 调用ImageIO类的write方法输出图象到客户端页面
			ImageIO.write(image, "JPEG", os);
		} catch (IOException e) {
			return "";
		}
		return strEnsure; // 返回生成的随机数
	}
}
